package ybl.baiducloud;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class QianFanService {
    // 创建一个 OkHttpClient 对象，用于发送 HTTP 请求
    private static final OkHttpClient client = new OkHttpClient();
    // 获取百度云配置信息
    private static final BaiduYunConf BAIDU_YUN_CONF = ConfigSingleton.getInstance();
    // 获取百度云服务的 API_KEY 和 SECRET_KEY
    private static final String API_KEY = BAIDU_YUN_CONF.getQIANFAN().getAPI_KEY().trim();
    private static final String SECRET_KEY = BAIDU_YUN_CONF.getQIANFAN().getSECRET_KEY().trim();

    /**
     * 执行 HTTP 请求并返回 JSONObject。
     *
     * @param request 请求对象
     * @return 响应的 JSONObject
     * @throws IOException  当网络出错时抛出
     * @throws ApiException 当 API 返回错误时抛出
     */
    private static JSONObject executeRequest(Request request) throws IOException, ApiException {
        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful())
                throw new IOException("Unexpected code " + response);

            String responseBody = response.body().string();
            JSONObject jsonObject = new JSONObject(responseBody);
            if (jsonObject.optInt("errcode", 0) != 0) {
                throw new ApiException("API Error: " + jsonObject.optString("errmsg", "Unknown error"));
            }
            return jsonObject;
        }
    }

    /**
     * 获取千帆 accesstoken
     * 
     * @return JSONObject 包含访问令牌的 JSON 对象
     * @throws ApiException 当 API 调用出错时抛出
     * @throws IOException  当网络通信出错时抛出
     */
    public static JSONObject getQianFanAccessToken()
            throws ApiException, IOException {

        String url = String.format(
                "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s",
                API_KEY, SECRET_KEY);
        Request request = new Request.Builder().url(url).build();

        return executeRequest(request);
    }

    /**
     * 与千帆进行对话的函数。
     * 使用指定的访问令牌和消息列表，通过调用百度 AI 自定义对话操作接口来进行对话。
     * 
     * @param accessToken 访问令牌，用于身份验证
     * @param messages    消息列表，作为对话的输入
     * @return 返回一个 JSONObject，包含从千帆接口获得的响应数据
     * @throws ApiException 当调用 API 时发生错误时抛出
     * @throws IOException  当进行网络通信时发生错误时抛出
     */
    public static JSONObject talkWithQianfan(String accessToken, List<Map<String, String>> messages)
            throws ApiException, IOException {

        String url = String.format(
                "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=%s",
                accessToken);

        String json = new JSONObject().put("messages", messages).toString();

        MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(json.getBytes(), mediaType);

        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        return executeRequest(request);
    }
}
